DEFINITION MODULE MyMathLibLong;
(*
  Created:   17.11.87
  Changed:   25.1.88/10.02.88/23.8.88/29.9.88 by
             Stefan Salewski
             Stolper Weg 3
             2160 Stade   West-Germany
             Tel: 04141/61130
             
  Note: compiled with AMIGA Modula-2 System by AMSoft from 5.5.88
   
  This Module may be freely copied. But please
  leave my name in. Thanks....Stefan  
*)

  CONST 
    Pi=3.141592653589793;
    PiHalbe=Pi*0.5;
    E=2.7182818284590452;
  TYPE AngleUnit=(rad,deg,gon);
  VAR
    unit:AngleUnit;     (* Einheit, die bei trigonomischen Berechnungen
                           verwendet wird. Voreinstellung: unit:=rad
                           Soll statt in Bogenmass in Grad oder Neugrad 
                           gerechnet werden, so muss unit entsprechend
                           gesetzt werden *)
    errorNumber:CARDINAL;(*Kann zur Ermittlung eines Fehlers verwendet werden
                           Jetzt wird errorNumber nur noch gesetzt, wenn
                           Fehler auftreten, das setzen von errornumber auf
                           0 durch die Funktionsprozeduren entfaellt.
                           Dadurch wird verhindert, das errorNumber z.B. nach
                           folgender Berechnung den falschen Wert 0 hat
                           sqr(sqrt(-4))
                           Wenn man Fehler erwartet, muss man also vor
                           Berechnungen errorNumber auf 0 setzen und
                           nach der Berechnung abfragen. Bei laengeren
                           ausdruecken erhaelt man immer die Nummer des
                           letzten Fehlers.
                         *)
    epsilon:LONGREAL; (* Bestimmt die Genauigkeit der Berechnung von sin,
                         exp,ln usw. Voreistellung: epsilon:=1.0E-20 entspricht
                         maximaler Genauigkeit,also mindestens 14 Dezimalstellen
                         epsilon kann fuer groessere Geschwindigkeit bis auf
                         1.0E-14 vergroessert werden, dann sind noch etwa 10
                         Stellen korrekt, was der Rechnengenauigkeit von dem
                         Standartmodul MathLibLong entspricht *)
    
(* 
  Die Zahlen zwischen '*' und ':' bezeichen jeweils den Wert, den errorNumber
  bekommt,wenn ein Fehler auftritt. FormelAusFText liefert dazu den Fehlertext.
*)

PROCEDURE neutraleFunc(x:LONGREAL):LONGREAL; 
(* Gibt x unveraendert zurueck                                              *)

PROCEDURE abs(x:LONGREAL):LONGREAL;
(* entspricht ABS(x), kann aber als Funktion uebergeben werden              *)

PROCEDURE fac(x:LONGREAL):LONGREAL; 
(* Fakultaet fuer ganze Zahlen 0 <= n <= 170                                *)
                                    (*75:Argument zu gross (x<710           *)
                                    (*76:fac(x) undef fuer x<0              *)
                                    (*77:fac(x) nur def. fuer x ganz        *)

PROCEDURE sqr(x:LONGREAL):LONGREAL; 
(* Quadrat x:=x*x                                                           *)
                                    (* 72:Argument >= 1E154                 *)

PROCEDURE power(x,y:LONGREAL):LONGREAL;
(* Raise x to the y th power                                                *)
                                (* 3:0^negative Zahl ist undefiniert        *)
                                (* 4:Neg.Zahl hoch gebr.Zahl ist undefiniert*)

PROCEDURE tan(x:LONGREAL):LONGREAL;
(* Tangens = sin(x)/cos(x)                                                  *)
                                          (* 5:tan(n*(Pi/2) ist undefiniert *)

PROCEDURE sin(x:LONGREAL):LONGREAL;
(* Sinus                                                                    *)

PROCEDURE cos(x:LONGREAL):LONGREAL;
(* Cosinus                                                                  *)

PROCEDURE cot(x:LONGREAL):LONGREAL;
(* Kotangens = 1/tan(x)                                                     *)
                                              (* 6:cot(n*Pi ist undefiniert *)

PROCEDURE sec(x:LONGREAL):LONGREAL;
(* Sekans = 1/cos(x)                                                        *)
                                              (* 7:sec hat Pol bei x=n*Pi/2 *)

PROCEDURE cosec(x:LONGREAL):LONGREAL;
(* Kosekans =1/sin(x)                                                       *)
                                              (* 8:cosec hat Pol bei x=n*Pi *)

PROCEDURE arcsin(x:LONGREAL):LONGREAL;
(* ArcusSinus= Umkehrfunktion des Sinus  -1<= x <= +1                       *)
                                      (* 9:arcsin(x)undefiniert fuer |x|>0  *)

PROCEDURE arccos(x:LONGREAL):LONGREAL;
(* ArcusCosinus = Umkehrfunktion des Cosinus -1 <=x <= +1                   *)
                                     (* 10:arccos(x) undefiniert fuer |x|>0 *)

PROCEDURE arctan(x:LONGREAL):LONGREAL; 
(* ArcusTangen = Umkehrfunktion des Tangens                                 *)

PROCEDURE arccot(x:LONGREAL):LONGREAL;
(* ArcusKotangens = Umkehrfunktion des Kotangens                            *)

PROCEDURE exp(x:LONGREAL):LONGREAL;
(* Exponentialfunktion                                                      *)
                                           (* 11:exp(x) zu gross fuer x>710 *)

PROCEDURE ln(x:LONGREAL):LONGREAL;
(* Natuerlicher Logarithmus zur Basis e=2.7182818                           *)
                                          (* 12:ln(x) undefiniert fuer x<=0 *)

PROCEDURE log(x:LONGREAL):LONGREAL;
(* Logarithmus zur Basis 10                                                 *)
                                         (* 13:log(x) undefiniert fuer x<=0 *)

PROCEDURE sinh(x:LONGREAL):LONGREAL;
(* Sinus Hyperbolicus  bzw. HyperbelSinus                                   *)

PROCEDURE cosh(x:LONGREAL):LONGREAL;
(* Cosinus Hyperbolicus bzw. HyperbelCosinus                                *)

PROCEDURE tanh(x:LONGREAL):LONGREAL;
(* Tangens Hyperbolicus bzw. HyperbelTangens                                *)

PROCEDURE coth(x:LONGREAL):LONGREAL;
(* Cotanges Hyperbolicus bzw. HyperbelCotangens                             *)
                                              (* 14:coth(x) hat Pol bei x=0 *)

PROCEDURE arsinh(x:LONGREAL):LONGREAL;
(* AreaSinus = Umkehrfunktion von sinh(x)                                   *)

PROCEDURE arcosh(x:LONGREAL):LONGREAL;
(* AreaCosinus = Umkehrfunktion von cosh(x)                                 *)
                                       (* 15:arcosh(x) undefiniert fuer x>1 *)

PROCEDURE artanh(x:LONGREAL):LONGREAL;
(* AreaTangens = Umkehrfunktion tanh(x)                                     *)
                                         (* 16:artanh(x) undefi fuer |x|>=1 *)

PROCEDURE sqrt(x:LONGREAL):LONGREAL;
(* AreaTangens = Umkehrfunktion tanh(x)                                     *)
                                         (* 17:sqrt(x) undefiniert fuer x<0 *)
PROCEDURE arcoth(x:LONGREAL):LONGREAL;
(* Areacotangens = Umkehrfunktion von coth                                  *)
                                  (* 19:arctan(x) undefiniert fuer |x|<=1.0 *)
PROCEDURE int(x:LONGREAL):LONGREAL;
(* Liefert den ganzaligen Anteil von x. int(4.3)=4; int(-4.3)=-4            *)
                          (* 20:int(x) |x| muss kleiner als 2147483648 sein *)
END MyMathLibLong.def
